En C++, gérer la croissance des conteneurs est une danse architecturale entre Taille (éléments actuels) et Capacité (mémoire réservée). Pour les conteneurs contigus comme vector et string, atteindre la capacité déclenche une réallocation: le système trouve un bloc de mémoire plus grand, déplace tous les éléments, puis détruit l'ancien bloc. C'est une opération coûteuse en $O(n)$ qui provoque invalidation des itérateurs—vos pointeurs vers les anciens éléments deviennent « pendulaires » et dangereux.
1. Stratégie d'expansion
Pour éviter les réallocations fréquentes, vector les implémentations allouent un espace « tampon ». La commande c.reserve(n) fixe explicitement une capacité minimale sans ajouter d'éléments, tandis que c.shrink_to_fit() est une demande non contraignante pour restituer la mémoire excédentaire au système d'exploitation.
2. Différence entre resize et reserve
Alors que reserve n'affecte que le tampon, resize(n) change activement la logique du conteneur. Le rétrécissement via resize détruit les éléments, tandis que l'expansion ajoute des valeurs initialisées par défaut.
resize le conteneur est rétréci, les itérateurs vers les éléments supprimés sont invalidés. Si l'expansion provoque une réallocation, TOUTS tous les itérateurs sont invalidés.